//
// Created by tatyx on 2025/8/24.
//

#ifndef GC_30_ROBSTRIDE_01_H
#define GC_30_ROBSTRIDE_01_H

#include "main.h"
#include "fdcan.h"
typedef struct
{
    FDCAN_HandleTypeDef *hcan;
    FDCAN_TxHeaderTypeDef Header;
    uint8_t Data[8];
}FDCAN1_TxFrame_TypeDef;
typedef struct
{
    FDCAN_HandleTypeDef *hcan;
    FDCAN_RxHeaderTypeDef Header;
    uint8_t Data[8];
}FDCAN1_RxFrame_TypeDef;

//电机模式
// 🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍
#define get_motor_ID        0x00 //获取设备id
#define motion_control       1   //运控模式

#define position_PP_control  1   //插补位置模式（PP）
#define speed_control        2   //速度模式
#define current_control      3   //电流模式
#define position_CSP_control 5   //位置模式（CSP）

#define get_motor_data      0x02 //获取电机数据（角度、位置、力矩、速度等）
#define motor_enable        0x03 //使能
#define motor_disable       0x04 //失能
#define set_zero_position   0x06 //设置机械零度
#define set_motor_ID        0x07 //设置电机ID
#define read_parameters     0x11 //读取参数
#define write_parameters    0x12 //写入参数
#define fault_detected      0x13 //错误检测
#define keep_parameters           0x16 //保存数据
#define baud_rate_changed   0x17 //改变波特率
#define data_report_mode    0x18 //主动上报
#define Robs_MasterID            0xFD //主机ID
#define OK                  0x00
#define ERROR               0x01


//可读写单个参数寄存器列表
// 🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍

#define run_mode        0x7005  //0: 运控模式 1: 插补位置模式 （PP）2: 速度模式 3: 电流模式 5：位置模式（CSP）读写属性( W/R )
#define iq_ref          0x7006  //电流模式Iq指令          值：    -23~23A   读写属性( W/R )
#define spd_ref         0x700A  //转速模式转速指令         值： -44~44rad/s 读写属性( W/R )
#define limit_torque    0x700B  //转矩限制                值：  0~17Nm     读写属性( W/R )
#define cur_kp          0x7010  //电流的Kp                值：  读写属性( W/R )
#define cur_ki          0x7011  //电流的Ki                值：  读写属性( W/R )
#define cur_filt_gain   0x7014  //电流滤波系数 filt_gain   值：  读写属性( W/R )
#define loc_ref         0x7016  //位置模式⻆度指令          值：  读写属性( W/R )
#define limit_spd       0x7017  //位置模式 (CSP)速度限制    值：  读写属性( W/R )
#define limit_cur       0x7018  //速度位置模式电流限制       值：  读写属性( W/R )
#define mechPos         0x7019  //负载端计圈机械⻆度         值：  读写属性( W/R )
#define iqf             0x701A  //iq滤波值                 值：  读写属性( W/R )
#define mechVel         0x701B  //负载端转速                值：  读写属性( W/R )
#define VBUS            0x701C  //⺟线电压                  值：  读写属性( W/R )
#define loc_kp          0x701E  //位置的kp                 值：  读写属性( W/R )
#define spd_kp          0x701F  //速度的kp                 值：  读写属性( W/R )
#define spd_ki          0x7020  //速度的ki                 值：  读写属性( W/R )
#define spd_filt_gain   0x7021  //速度滤波值                值：  读写属性( W/R )
#define acc_rad         0x7022  //速度模式加速度            值：  读写属性( W/R )
#define vel_max         0x7024  //位置模式(PP)速度          值：  读写属性( W/R )
#define acc_set         0x7025  //位置模式（PP）加速度       值：  读写属性( W/R )
#define EPScan_time     0x7026  //上报时间设置，1 代表10ms，加1 递增5ms  读写属性( W/R )
#define canTimeout      0x7028  //can超时阀值，20000代表1s             读写属性( W/R )



//报错类型及状态
// 🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍🍉🍍
#define encoder_calibration 21 //标定状态
#define overload            20 //过载
#define overtemprrature     19 //过温
#define encoder             18 //编码器
#define driver              17 //驱动
#define undervoltage        16 //欠压


typedef struct
{
    float angle;      //(-12.57f~12.57f)rad
    float velocity;   //(-44rad/s~44rad/s)
    float Torque;     //（-17Nm~17Nm）
    float temprrature;//
    float index_value;
    u16 index;
    u8 motorID;
}Robs_TypeDef;

// 🍏🍎🍏🍎🍏🍎🍏🍎🍏🍎🍏🍎🍏🍎🍏🍎🍏🍎🍏🍎
void Robs_FDCAN_TxData_8byteS(FDCAN1_TxFrame_TypeDef *TxFrame, u8 *data, u8 masterID, u8 motorID,u8 mode);
void Robs_Enable_motor(Robs_TypeDef *motor);
void Robs_DisEnable_motor(Robs_TypeDef *motor);
void Robs_Set_Zero_position(Robs_TypeDef *motor);
void Robs_Read_Parameters(Robs_TypeDef *motor,u16 index);
void Robs_Write_Parameters_float(Robs_TypeDef *motor,u16 index,float Value);

// 🌈 💦 🌀 🌈 💦 🌀 🌈 💦 🌀 🌈 💦 🌀 🌈 💦 🌀
void Robs_Mit_mode(Robs_TypeDef *motor,float angle, float speed, float kp, float kd);
void Robs_Position_set(Robs_TypeDef *motor,u8 position_mode);
void Robs_Position_PP_control(Robs_TypeDef *motor, float speed, float acceleration, float position);


// 💫・🌠・💫・🌠・💫・🌠・💫・🌠・💫・🌠・💫・🌠・💫
void Robs_data_deal(FDCAN1_RxFrame_TypeDef *RxFrame);

#endif //GC_30_ROBSTRIDE_01_H